package com.github.yelisheng.constant;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Getter;

/**
 * 查询类型枚举
 *
 * @author 叶璃笙
 */
@Getter
public enum QueryType {
    EQ("等于", "eq") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.eq(column, value);
        }
    },
    NE("不等于", "ne") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.ne(column, value);
        }
    },
    LIKE("模糊匹配", "like") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.like(column, value);
        }
    },
    LIKE_LEFT("左模糊", "likeLeft") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.likeLeft(column, value);
        }
    },
    LIKE_RIGHT("右模糊", "likeRight") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.likeRight(column, value);
        }
    },
    LE("小于等于", "le") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.le(column, value);
        }
    },
    LT("小于", "lt") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.lt(column, value);
        }
    },
    GE("大于等于", "ge") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.ge(column, value);
        }
    },
    GT("大于", "gt") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.gt(column, value);
        }
    },
    IS_NULL("为NULL", "isNull") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.isNull(column);
        }
    },
    IS_NOT_NULL("不为NULL", "isNotNull") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.isNotNull(column);
        }
    },
    IS_EMPTY("为空", "isEmpty") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.eq(column, "");
        }
    },
    IS_NOT_EMPTY("不为空", "isNotEmpty") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.ne(column, "");
        }
    },
    CUSTOMIZE("自定义SQL", "customize") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            wrapper.apply(String.valueOf(value));
        }
    },
    IGNORE("忽略字段", "ignore") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            // 不做任何操作
        }
    },
    CONDITION("条件表达式", "condition") {
        @Override
        public <T> void apply(QueryWrapper<T> wrapper, String column, Object value) {
            // 在MpUtil中特殊处理
        }
    };

    private final String description;
    private final String value;

    QueryType(String description, String value) {
        this.description = description;
        this.value = value;
    }

    /**
     * 应用查询条件到Wrapper
     */
    public abstract <T> void apply(QueryWrapper<T> wrapper, String column, Object value);

    /**
     * 从字符串值获取枚举
     */
    public static QueryType fromValue(String value) {
        for (QueryType type : values()) {
            if (type.value.equalsIgnoreCase(value)) {
                return type;
            }
        }
        return EQ; // 默认返回EQ
    }
}